// Include Libraries
include 'lib/inc.php';
/*-------------------------------*\
THEME SETTINGS
\*-------------------------------*/
// Register Menu
function register_menus() {
register_nav_menu('header-menu', 'Header');
register_nav_menu('footer-menu', 'Footer');
}
add_action('init', 'register_menus');
/*-------------------------------*\
MEDIA SETTINGS/IMAGE SIZES
\*-------------------------------*/
// Set the Default Thumbnail Size
update_option('thumbnail_size_w', 420);
update_option('thumbnail_size_h', 300);
update_option('thumbnail_crop', 1);
// Set the Default Medium Size
update_option('medium_size_w', 1000);
update_option('medium_size_h', 1000);
// Set the Default Medium-Large Size
update_option('medium_large_size_w', 2000);
update_option('medium_large_size_h', 2000);
// Set the Default Large Size
update_option('large_size_w', 3000);
update_option('large_size_h', 3000);
// Custom Wide Center Crop Size (for hero/slideshow)
add_image_size('wide_small', 1000, 333, true);
add_image_size('wide_medium', 2000, 666, true);
add_image_size('wide_large', 3000, 1000, true);
// Register Custom Sizes in Admin
function custom_wide_size( $sizes ) {
return array_merge( $sizes, array(
'medium_large' => 'Medium-Large',
'wide_large' => 'Wide Large',
'wide_medium' => 'Wide Medium',
'wide_small' => 'Wide Small'
) );
}
add_filter('image_size_names_choose', 'custom_wide_size');
// Force-disable Month/Year Uploads
update_option('uploads_use_yearmonth_folders', false);
/*-------------------------------*\
LOG IN
\*-------------------------------*/
// Login Logo Image
function login_logo() { ?>
}
add_action('login_enqueue_scripts', 'login_logo');
// Log-In Logo URL
function custom_login_logo_url() {
return home_url();
}
add_filter('login_headerurl', 'custom_login_logo_url');
// Log-In Logo Title
function change_title_on_logo() {
return 'Log In';
}
add_filter('login_headertitle', 'change_title_on_logo');
/*-------------------------------*\
VISUAL EDITOR
\*-------------------------------*/
// Set Default Editor to Visual
function wp_default_visual_editor() {
return 'tinymce';
}
add_filter('wp_default_editor', 'wp_default_visual_editor');
/*
Hide the Visual Editor on Pages as ACF Layouts
make the native WordPress TinyMCE editor redundant.
*/
function init_remove_support() {
remove_post_type_support('page', 'editor');
}
add_action('init', 'init_remove_support', 100);
/* Load the theme's stylesheet in the visual editor
Since TinyMCE has the content class and our content on the
front end is also inside a wrapper with the same class, the
appearance of content in the WYSIWYG editor will be consistent.
*/
function custom_editor_style() {
add_editor_style('css/layouts.min.css');
add_editor_style('css/theme.min.css');
}
add_action('admin_init', 'custom_editor_style');
// Check if Visual Editor is Really Empty (disregards empty tags, whitespace and )
function empty_content($str) {
return trim(str_replace(' ','',strip_tags($str))) == '';
}
/*-------------------------------*\
GALLERY
\*-------------------------------*/
// Custom WordPress Gallery Shortcode Output
function my_post_gallery($output, $attr) {
global $post;
if (isset($attr['orderby'])) {
$attr['orderby'] = sanitize_sql_orderby($attr['orderby']);
if (!$attr['orderby'])
unset($attr['orderby']);
}
extract(shortcode_atts(array(
'order' => 'ASC',
'orderby' => 'menu_order ID',
'id' => $post->ID,
'size' => 'thumbnail',
'include' => '',
'exclude' => ''
), $attr));
$id = intval($id);
if ('RAND' == $order) $orderby = 'none';
if (!empty($include)) {
$include = preg_replace('/[^0-9,]+/', '', $include);
$_attachments = get_posts(array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby));
$attachments = array();
foreach ($_attachments as $key => $val) {
$attachments[$val->ID] = $_attachments[$key];
}
}
if (empty($attachments)) return '';
// Output
$output = "\n";
// Now loop through each attachment
foreach ($attachments as $id => $attachment) {
$img = wp_get_attachment_image_src($id, 'full');
$thumb = wp_get_attachment_image_src($id, 'thumbnail');
$caption = wptexturize($attachment->post_excerpt);
$output .= "
![\"\"]()
\n";
}
$output .= "
\n";
$output .= wp_enqueue_script('baguetteBox', get_template_directory_uri() . '/js/lib/baguetteBox.min.js', false, null, true);
wp_add_inline_script('baguetteBox', 'baguetteBox.run(".gallery");');
wp_enqueue_style('baguetteBox', get_template_directory_uri() . '/css/lib/baguetteBox.min.css', false, null);
return $output;
}
add_filter('post_gallery', 'my_post_gallery', 10, 2);
/*-------------------------------*\
ADMIN
\*-------------------------------*/
/*
Disable the Admin Bar outside the Dashboard as it
can interfere if the theme has a "sticky" navigation.
*/
show_admin_bar(false);
// Custom Dashboard CSS
function custom_dashboard_css() {
// For Everyone
echo '';
// For Admin
if (current_user_can('administrator')) {
echo '';
}
// For Editor
if (!current_user_can('administrator')) {
echo '';
}
}
add_action('admin_head', 'custom_dashboard_css');
// Remove "Thank you for creating with WordPress." From Admin Footer
function change_footer_admin() {
echo '';
}
add_filter('admin_footer_text', 'change_footer_admin');
// Remove "Howdy" From Admin Bar
function replace_howdy($wp_admin_bar) {
$my_account=$wp_admin_bar->get_node('my-account');
$newtitle = str_replace('Howdy,', 'Logged In:', $my_account->title);
$wp_admin_bar->add_node(array(
'id' => 'my-account',
'title' => $newtitle,
) );
}
add_filter('admin_bar_menu', 'replace_howdy', 25);
// Remove Feature Support
function remove_feature_support() {
// Comments
remove_post_type_support('post', 'comments');
remove_post_type_support('page', 'comments');
remove_post_type_support('attachment', 'comments');
// Trackbacks
remove_post_type_support('post', 'trackbacks');
// Custom Fields
remove_post_type_support('post', 'custom-fields');
remove_post_type_support('page', 'custom-fields');
// Excerpt
remove_post_type_support('post', 'excerpt');
// Revisions
remove_post_type_support('post', 'revisions');
}
add_action('init', 'remove_feature_support', 100);
// Hide "Help" tab
function remove_help_tabs( $old_help, $screen_id, $screen ) {
$screen->remove_help_tabs();
return $old_help;
}
add_filter('contextual_help', 'remove_help_tabs', 999, 3);
// Hide the Dashboard and Redirect to New Page Screen
add_action('admin_init', function () {
global $pagenow; // Get current page
$redirect = get_admin_url(null, 'edit.php?post_type=page' );
if ($pagenow == 'index.php') {
wp_redirect( $redirect, 301 );
exit;
}
});
// Clean Admin Bar
add_action('admin_bar_menu', function ($admin_bar) {
$admin_bar->remove_menu('wp-logo');
$admin_bar->remove_menu('view-site');
$admin_bar->remove_menu('comments');
// $admin_bar->remove_menu('new-post');
}, 999);
// Remove Admin Menus
function remove_admin_menus() {
// Hide Dashboard
remove_menu_page('index.php');
// Hide Posts
// remove_menu_page('edit.php');
// Hide Plug-ins
remove_menu_page('plugins.php');
// Hide Tools
remove_menu_page('tools.php');
// Hide Comments Menu
remove_menu_page('edit-comments.php');
// Hide Media Menu
remove_submenu_page('options-general.php', 'options-media.php');
// Hide Writing Menu
remove_submenu_page('options-general.php', 'options-writing.php');
// Hide Discussion Menu
remove_submenu_page('options-general.php', 'options-discussion.php');
// Remove Themes and Settings for Editors
if (!current_user_can('administrator')) {
remove_submenu_page('options-general.php', 'options-general.php');
remove_submenu_page('options-general.php', 'options-reading.php');
remove_submenu_page('options-general.php', 'options-permalink.php');
global $submenu;
unset($submenu['themes.php'][5]);
}
}
add_action('admin_menu', 'remove_admin_menus');
// Custom Admin Menu Order
function custom_menu_order($menu_ord) {
if (!$menu_ord) return true;
return array(
'edit.php?post_type=page', // Pages
'edit.php', // Posts
'upload.php', // Media
'themes.php', // Appearance
'users.php', // Users
// 'plugins.php', // Plugins
'options-general.php', // Settings
);
}
add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');
// Remove Options in WP Customizer That are Dangerous for Clients
function remove_customizer_options( $wp_customize ) {
$user = wp_get_current_user();
if (!$user->has_cap('administrator')) {
$wp_customize->remove_section('static_front_page');
$wp_customize->remove_section('custom_css');
}
}
add_action('customize_register', 'remove_customizer_options', 15);
// Allow SVG Uploads
function wpcontent_svg_mime_type($mimes = array()) {
$mimes['svg'] = 'image/svg+xml';
$mimes['svgz'] = 'image/svg+xml';
return $mimes;
}
add_filter('upload_mimes', 'wpcontent_svg_mime_type');
/*-------------------------------*\
FEATURED IMAGES
\*-------------------------------*/
add_theme_support('post-thumbnails', array('post'));
/*-------------------------------*\
USER ROLES
\*-------------------------------*/
// Hide Roles other than Admin and Editor
function exclude_role($roles) {
if (isset($roles['author'])) {
unset($roles['author']);
}
if (isset($roles['subscriber'])) {
unset($roles['subscriber']);
}
if (isset($roles['contributor'])) {
unset($roles['contributor']);
}
return $roles;
}
add_filter('editable_roles', 'exclude_role');
// Let Editors Manage Users and Change Navigation */
function editor_manage_users() {
if (get_option('add_cap_editor') != 'done' ) {
$edit_editor = get_role('editor');
$edit_editor->add_cap('edit_users');
$edit_editor->add_cap('list_users');
$edit_editor->add_cap('create_users');
$edit_editor->add_cap('add_users');
$edit_editor->add_cap('delete_users');
$edit_editor->add_cap('edit_theme_options');
update_option('add_cap_editor', 'done');
}
}
add_action('init', 'editor_manage_users');
// Prevent editor from deleting, editing, or creating an administrator
class Editor_User_Caps {
// Add our filters
function __construct() {
add_filter( 'editable_roles', array(&$this, 'editable_roles'));
add_filter( 'map_meta_cap', array(&$this, 'map_meta_cap'),10,4);
}
// Remove 'Administrator' from the list of roles if the current user is not an admin
function editable_roles( $roles ){
if( isset( $roles['administrator'] ) && !current_user_can('administrator') ){
unset( $roles['administrator']);
}
return $roles;
}
// If someone is trying to edit or delete an
// admin and that user isn't an admin, don't allow it
function map_meta_cap( $caps, $cap, $user_id, $args ){
switch( $cap ){
case 'edit_user':
case 'remove_user':
case 'promote_user':
if( isset($args[0]) && $args[0] == $user_id )
break;
elseif( !isset($args[0]) )
$caps[] = 'do_not_allow';
$other = new WP_User( absint($args[0]) );
if( $other->has_cap( 'administrator' ) ){
if(!current_user_can('administrator')){
$caps[] = 'do_not_allow';
}
}
break;
case 'delete_user':
case 'delete_users':
if( !isset($args[0]) )
break;
$other = new WP_User( absint($args[0]) );
if( $other->has_cap( 'administrator' ) ){
if(!current_user_can('administrator')){
$caps[] = 'do_not_allow';
}
}
break;
default:
break;
}
return $caps;
}
}
$editor_user_caps = new Editor_User_Caps();
// Hide all administrators from user list if not admin
function hide_user_query($user_search) {
$user = wp_get_current_user();
if (!current_user_can('edit_themes')) {
global $wpdb;
$user_search->query_where =
str_replace('WHERE 1=1',
"WHERE 1=1 AND {$wpdb->users}.ID IN (
SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta
WHERE {$wpdb->usermeta}.meta_key = '{$wpdb->prefix}capabilities'
AND {$wpdb->usermeta}.meta_value NOT LIKE '%administrator%')",
$user_search->query_where
);
}
}
add_action('pre_user_query','hide_user_query');
/*-------------------------------*\
CLEAN BODY CLASS
\*-------------------------------*/
// Because the default body_class() is messy
function clean_body_class() {
global $post;
echo str_replace('.php', '', get_page_template_slug());
if ($post->post_title) {
$title = strtolower($post->post_title);
$page_title = str_replace(' ', '-', $title);
}
if (is_home() ) {
echo ' page-blog';
}
if (is_front_page() ) {
echo ' page-home';
}
if (!is_home() && !is_front_page()) {
if (is_page()) {
echo ' page-' . $page_title;
}
if (is_singular('post')) {
echo ' post-' . $page_title;
}
if (is_404()) {
echo ' page-404';
}
if (is_archive() && !is_tax()) {
echo ' page-archive';
}
if (is_tax()) {
echo ' page-taxonomy';
}
}
}
/*-------------------------------*\
ADMIN BODY CLASS
\*-------------------------------*/
add_filter('admin_body_class', function($classes) {
// Add Current User Role
global $current_user;
if (is_array($current_user->roles)) {
foreach($current_user->roles as $role) {
$classes .= "user_role_{$role} ";
}
}
// Add Always-Folded Menu
$classes .= ' folded ';
return rtrim($classes);
});
/*-------------------------------*\
CLEAN HEAD
\*-------------------------------*/
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'wp_shortlink_wp_head');
remove_action('wp_head', 'rel_canonical');
remove_action('wp_head', 'feed_links_extra', 3);
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
remove_action('wp_head', 'wp_site_icon', 99);
remove_action('wp_head', 'rest_output_link_wp_head', 10);
remove_action('wp_head', 'wp_resource_hints', 2);
/*-------------------------------*\
CLEAN NAVIGATION
\*-------------------------------*/
// Remove Ugly Generated Classes
function custom_wp_nav_menu($var) {
return is_array($var) ? array_intersect($var, array(
// List of Allowed Menu Classes
'current-menu-item',
'menu-item-has-children',
'btn-nav'
)) : '';
}
add_filter('nav_menu_css_class', 'custom_wp_nav_menu');
add_filter('nav_menu_item_id', 'custom_wp_nav_menu');
add_filter('page_css_class', 'custom_wp_nav_menu');
// Renames Classes with Shorter Alternatives
function shorter_classes($text){
$replace = array(
'current-menu-item' => 'current',
'menu-item-has-children' => 'parent',
);
$text = str_replace(array_keys($replace), $replace, $text);
return $text;
}
add_filter('wp_nav_menu', 'shorter_classes');
/*-------------------------------*\
CLEAN FRONT-END
\*-------------------------------*/
// Remove the WordPress Version from RSS Feeds
add_filter('the_generator', '__return_false');
// Remove Inline Width Style Added by WordPress to WYSIWYG Image Captions
function fixed_img_caption_shortcode($attr, $content = null) {
if (!isset($attr['caption'])) {
if (preg_match('#((?:]+>s*)?
]+>(?:s*)?)(.*)#is', $content, $matches)) {
$content = $matches[1];
$attr['caption'] = trim( $matches[2] );
}
}
$output = apply_filters('img_caption_shortcode', '', $attr, $content);
if ($output != '')
return $output;
extract(shortcode_atts(array(
'id' => '',
'align' => 'alignnone',
'width' => '',
'caption' => ''
), $attr));
if (1 > (int) $width || empty($caption))
return $content;
if ($id) $id = 'id="' . esc_attr($id) . '" ';
return '
'
. do_shortcode($content) . '
' . $caption . '
';
}
add_shortcode('wp_caption', 'fixed_img_caption_shortcode');
add_shortcode('caption', 'fixed_img_caption_shortcode');
/*-------------------------------*\
DISABLE EMOJI
\*-------------------------------*/
add_action('init', function () {
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('admin_print_styles', 'print_emoji_styles');
remove_filter('the_content_feed', 'wp_staticize_emoji');
remove_filter('comment_text_rss', 'wp_staticize_emoji');
remove_filter('wp_mail', 'wp_staticize_emoji_for_email');
add_filter('emoji_svg_url', '__return_false');
// Filter to remove TinyMCE emojis
add_filter('tiny_mce_plugins', function ($plugins) {
if (is_array($plugins)) {
return array_diff($plugins, array('wpemoji'));
}
return array();
});
});
/*-------------------------------*\
SHORTCODES
\*-------------------------------*/
// iframe
function iframe($atts) {
extract(shortcode_atts(array(
'src' => "",
'width' => "100%",
'height' => "1200px",
'class' => ""
), $atts));
$iframe = '';
return $iframe;
}
add_shortcode('iframe', 'iframe');
/*-------------------------------*\
MISC
\*-------------------------------*/
// Force WordPress Admin to 1 column
function so_screen_layout_columns($columns) {
$columns['page'] = 1;
return $columns;
}
add_filter('screen_layout_columns', 'so_screen_layout_columns');
// Redirect Useless Attachment Page to Parent Page
function attachment_redirect() {
global $post;
if (is_attachment() && isset($post->post_parent) && is_numeric($post->post_parent) && ($post->post_parent != 0)) {
wp_redirect(get_permalink($post->post_parent ), 301);
exit();
}
}
add_action('template_redirect', 'attachment_redirect');
// Disable WordPress API
function only_allow_logged_in_rest_access($access) {
if(!is_user_logged_in()) {
return new WP_Error('rest_cannot_access', 'Only authenticated users can access the REST API.',
array('status' => rest_authorization_required_code()));
}
return $access;
}
add_filter('rest_authentication_errors', 'only_allow_logged_in_rest_access');
// Auto Update WordPress
add_filter('allow_major_auto_core_updates', '__return_true');
// Auto Update Plug-Ins
add_filter('auto_update_plugin', '__return_true');